/* ejercicio 1 */

  % todas las ciudades
  ?- ciudades([atlanta, buenos_aires, cordoba, lisboa, madrid, mdq, new_york, rio, salta]).

  % agrego una ciudad de la que salen vuelos y me fijo que esté
  ?- assert(llega(miami,buenos_aires, 7)).
  ?- ciudades([atlanta, buenos_aires, cordoba, lisboa, madrid, mdq, miami, new_york, rio, salta]).
  ?- retract(llega(miami,buenos_aires, 7)).

  % agrego una ciudad a la que llegan salen vuelos y me fijo que esté
  ?- assert(llega(buenos_aires, miami, 7)).
  ?- ciudades([atlanta, buenos_aires, cordoba, lisboa, madrid, mdq, miami, new_york, rio, salta]).
  ?- retract(llega(buenos_aires, miami, 7)).

  % agrego una ruta con ciudades existentes y me fijo que no haya repetidos
  ?- assert(llega(buenos_aires, cordoba, 7)).
  ?- ciudades([atlanta, buenos_aires, cordoba, lisboa, madrid, mdq, new_york, rio, salta]).
  ?- retract(llega(buenos_aires, cordoba, 7)).


/* ejercicio 2 */

  % recorrido nulo.
  ?- viajaDesde(buenos_aires, buenos_aires, [buenos_aires], 0).

  % un recorrido mínimo y con ciclo
  ?- viajaDesde(buenos_aires, salta, [buenos_aires, cordoba, salta], 3).
  ?- viajaDesde(buenos_aires, salta, [buenos_aires, rio, new_york, madrid, buenos_aires, cordoba, salta], 38).

  % la distancia total debe ser correcta
  ?- not(viajaDesde(buenos_aires, salta, [buenos_aires, cordoba, salta], 4)).
  ?- not(viajaDesde(buenos_aires, salta, [buenos_aires, cordoba, salta], 8)).


/* ejercicio 3 */

  % recorridos válidos sin ciclos
  ?- viajeSinCiclos(buenos_aires, lisboa, [buenos_aires, rio, new_york, madrid, lisboa], 24).
  ?- viajeSinCiclos(buenos_aires, lisboa, [buenos_aires, madrid, lisboa], 13).
  ?- viajeSinCiclos(buenos_aires, lisboa, [buenos_aires, atlanta, new_york, madrid, lisboa], 24).

  % recorrido válido pero con tiempo erróneo
  ?- not(viajeSinCiclos(buenos_aires, lisboa, [buenos_aires, rio, new_york, madrid, lisboa], 20)).

  % recorrido con ciclo no vale
  ?- not(viajeSinCiclos(buenos_aires, lisboa, [buenos_aires, madrid, buenos_aires, madrid, lisboa], 37)).
  ?- not(viajeSinCiclos(buenos_aires, madrid, [buenos_aires, rio, new_york, madrid, lisboa, madrid], 25)).

  % no vale misma llegada que partida
  ?- not(viajeSinCiclos(buenos_aires, buenos_aires, [buenos_aires, mdq, buenos_aires], 2)).


/* ejercicio 4 */

  % el viaje más corto de los que vimos antes
  ?- viajeMasCorto(buenos_aires, lisboa, [buenos_aires, madrid, lisboa], 13).

  % si cambio el recorrido deja de ser cierto
  ?- not(viajeMasCorto(buenos_aires, lisboa, [buenos_aires, atlanta, new_york, madrid, lisboa], 24)).

  % si le paso una longitud incorrecta deja de ser cierto
  ?- not(viajeMasCorto(buenos_aires, lisboa, [buenos_aires, madrid, lisboa], 10)).


/* ejercicio 5 */

  % el grafo actual es correcto.
  ?- grafoCorrecto.

  % si agrego una ciudad que no tiene salidas deja de ser correcto.
  ?- assert(llega(buenos_aires, miami, 7)).
  ?- not(grafoCorrecto).
  ?- retract(llega(buenos_aires, miami, 7)).

  % si agrego otra componente conexa deja de ser correcto
  ?- assert(llega(miami, san_francisco, 2)).
  ?- assert(llega(san_francisco, miami, 2)).
  ?- not(grafoCorrecto).
  ?- retract(llega(miami, san_francisco, 2)).
  ?- retract(llega(san_francisco, miami, 2)).


/* ejercicio 6 */

  % recorrido válido y avión que puede cubrirlo.
  ?- cubreDistancia([buenos_aires, atlanta, new_york], boeing_767).
  ?- cubreDistancia([atlanta, new_york], boeing_767).

  % recorrido válido pero al avión no le alcanza.
  ?- not(cubreDistancia([buenos_aires, atlanta, new_york], airbus_a320)).

  % recorrido válido cargando el tanque.
  ?- cubreDistancia([rio, new_york, madrid], boeing_747).

  % recorrido invalido en segundo tramo aunque se llene el tanque en escala.
  ?- not(cubreDistancia([buenos_aires, rio, new_york],airbus_a320)).

  % recorrido inválido.
  ?- not(cubreDistancia([buenos_aires, madrid, new_york], boeing_767)).

  % no cubre distancia de cualquier cosa
  ?- not(cubreDistancia([ciudad_falsa], avion_falso)).
  ?- not(cubreDistancia([], avion_falso)).


/* ejercicio 7 */

  % una base operativa tiene un avión inválido.
  ?- not(vueloSinTransbordo([(buenos_aires, [boeing_767, pepito])], buenos_aires, madrid, _, _)).

  % una base operativa tiene una ciudad inválida.
  ?- not(vueloSinTransbordo([(buenos_aires, [boeing_767]), (pepito, [boeing_767])], buenos_aires, madrid, _, _)).

  % hay dos bases operativas para la misma ciudad.
  ?- not(vueloSinTransbordo([(buenos_aires, [boeing_767]), (buenos_aires, [airbus_a320])], buenos_aires, madrid, _, _)).

  % el avión no está ubicado en la ciudad orígen.
  ?- not(vueloSinTransbordo([(buenos_aires, [boeing_767])], buenos_aires, madrid, _, airbus_a320)).

  % el avión no está ubicado en la ciudad orígen.
  ?- not(vueloSinTransbordo([(buenos_aires, [boeing_767]), (madrid, [])], buenos_aires, madrid, _, airbus_a320)).

  % el tiempo de recorrido intentado es menor al óptimo.
  ?- not(vueloSinTransbordo([(buenos_aires, [boeing_767])], buenos_aires, madrid, 10, boeing_767)).

  % el tiempo de recorrido intentado es mayor al óptimo.
  ?- not(vueloSinTransbordo([(buenos_aires, [boeing_767])], buenos_aires, madrid, 14, boeing_767)).

  % al avión no le alcanza la autonomía.
  ?- not(vueloSinTransbordo([(buenos_aires, [boeing_767])], buenos_aires, madrid, 12, airbus_a320)).

  % vuelo directo
  ?- vueloSinTransbordo([(buenos_aires, [boeing_767])], buenos_aires, madrid, 12, boeing_767).

  % vuelo con escalas
  ?- vueloSinTransbordo([(buenos_aires, [boeing_767])], buenos_aires, lisboa, 13, boeing_767).